#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 对于快排结构体,我们需要在排序之前确定我们要排序的数据类型是什么,再根据数据类型来写函数
// 就比如这个来举例子: 我们写了一个有两种数据类型的结构体,所以我们根据参数写了两个自定义函数来排序

struct Stu // 结构体,有两种数据类型
{

    char name [20] ;

    int age ;

};

int com_stu_by_age (const void* p1 , const void* p2) // 以结构体的年龄为排序标准写的函数
{

    return ((struct Stu*) p1) -> age - ((struct Stu*) p2) -> age ;

}

int cmp_stu_by_name (const void* p1 , const void* p2) // 以结构体的名字作为排序标准写的函数
{

    return strcmp (((struct Stu*) p1) -> name , ((struct Stu*) p2) -> name) ; // 这里使用了strcmp函数来排序,可以了解一些它是这么排序的

}

void pt (struct Stu* arr)
{

    printf ("%s %d\n" , arr->name , arr->age) ; // 打印函数,将比对后的结果给打印出来

}


int main ()
{   

    struct Stu arr [] = {{"zhangsan" , 18} , {"lisi" , 25} , {"wangwu" , 12}} ;

    size_t sz = sizeof (arr) / sizeof (arr [0]) ;

    qsort (arr , sz , sizeof (arr [0]) , com_stu_by_age) ;

    for (int i = 0 ; i < sz ; i++)
    {

        pt (arr + i) ;

    }

    printf ("\n") ;

    qsort (arr , sz , sizeof (arr [0]) , cmp_stu_by_name) ;

    for (int i = 0 ; i < sz ; i++)
    {

        pt (arr + i) ;

    }

}